# -*- coding: utf-8 -*-
"""
@Time ： 2022/7/21 20:39
@Auth ： Mr. William 1052949192
@Company ：特斯汀学院 @testingedu.com.cn
@Function ：函数的参数列表
"""


def func1(a, b, c, *args):
    """
    按传递顺序，一一对应。
    注意：必填位置型参数必须写在通用位置参数的前面
    :param a,b,c: 必填位置型参数
    :param args: 通用位置参数（可以接收0-∞个参数，接收为元组）
    """
    print(a, b, c)
    print(args)


# func1(1, 2, 3, 4, 1111)


def func2(x: int = 1, y=2, **kwargs):
    """
    键值对参数：按键值对应接收，与顺序无关
    :param x,y: 带默认值的参数，也可以按位置传（不推荐）
    :kwargs 未定义的键值对参数，都接收为一个字典
    """
    print(x, y)
    print(kwargs)


# 不传就使用默认值
func2()
# 带默认值参数可以按位置传
func2(1, 2)
# 未定义的键值对参数，接收为一个字典
func2(z=33,n='will',x=11,y=22)


# 混合参数：键值对参数一定要写在位置型参数后面
def func3(a,*args,b=1,**kwargs):
    print(a,b)
    print(args,kwargs)


func3(1,2,3,b=11,c=22,d=33)


# 线性数据结构，可以通过*p的形式迭代传入参数列表
p = (1, 2, 3, 4, 5)
func1(1, 2, 3, 4, 5)
func1(*p)

# 键值对数据结构可以通过**p的形式迭代传入参数列表
p = {'x': 11, 'y': 22, 'z': 33, 'n': 'will'}
func2(z=33, n='will', x=11, y=22)
func2(**p)


# 通用传参方式
def func4(*args,**kwargs):
    print(args,kwargs)


func4(1,1,3,a=1,b=2,c=3)
